package pl.edu.pw.elka.tinyrepo.dataserver.server;

import java.io.File;
import java.io.Serializable;

import pl.edu.pw.elka.tinyrepo.common.DAVServer;
import pl.edu.pw.elka.tinyrepo.common.Request;
import pl.edu.pw.elka.tinyrepo.gate.server.GateFacade;

/**
 * Glowna klasa serwera danych. Rozszerza typowy serwer WebDAVa o okreslone
 * handlery requestow.
 * 
 * @author Piotr Jarosik
 */
public class DataServer extends DAVServer implements Serializable {
   /** */
   private static final long serialVersionUID = -2485292859485372145L;
   /** Katalog w ktorym beda przechowywane pliki. */
   private File dataCatalog;
   /** Brama, z ktora polaczony jest serwer. */
   private GateFacade gate;
   
   /**
    * @param port
    */
   public DataServer(Integer port, String dataCatalogPath, GateFacade gate) {
      super(port);
      this.dataCatalog = new File(dataCatalogPath);
      this.gate = gate;
      if(!dataCatalog.isDirectory()) {
         // podany katalog nie istnieje - sprobuj go utworzyc
         System.err.println("Couldn't open directory: "+dataCatalogPath+". Creating it...");
         if(!dataCatalog.mkdirs())
            throw new RuntimeException("Cannot create root directory");
      }
      addHandler("GET", new GETRequestHandler(dataCatalog, this.gate));
      addHandler("PUT", new PUTRequestHandler(dataCatalog, this.gate));
      addHandler("DELETE", new DELETERequestHandler(dataCatalog, this.gate));
      addHandler("PROPFIND", new PROPFINDRequestHandler(dataCatalog, this.gate));
   }
   
   
   /**
    * Usuwa plik o podanym id. 
    * @param id
    * @return true - gdy usunieto, false - jezeli pliku nie bylo lub inne problemy.
    */
   public boolean removeFile(String id) {
      File f = new File(dataCatalog, id);
      return f.delete();
   }
   // TODO z kopiowaniem na razie jest problem, bo RMI nie pozwala przekazywac strumieni miedzy
   //
   
}
